package com.mycode.singleton01;

import java.util.Objects;

/**
 * 懒汉式单例
 * 在第一次使用的时候才创建，暂用资源少，实现了延迟加载，但需要注意多线程同时访问的问题
 */
public class LazySingleton {

    // 使用双重检查机制需要成员变量被 volatile 修饰，让某一个线程修改的值被其他线程可见
    private volatile static LazySingleton lazySingleton = null;

    private LazySingleton() {

    }

    /**
     * 双重检查机制
     * @return
     */
    public static LazySingleton getInstance() {
        if (Objects.isNull(lazySingleton)) {
            synchronized (LazySingleton.class) {
                if (Objects.isNull(lazySingleton)) {
                    lazySingleton = new LazySingleton();
                }
            }
        }
        return lazySingleton;
    }
}
